#ifndef __SENSOR_BASE_H__
#define __SENSOR_BASE_H__

#include <sensor_msgs/PointCloud2.h>
#include <sensor_msgs/LaserScan.h>
#include <sensor_msgs/Imu.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/CameraInfo.h>
#include <nav_msgs/Odometry.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

#include <iostream>
#include "common/glog/glog.h"
using namespace std;


// 过滤配置
struct SensorFilterConfig{
    // 最高数据  z值高于此数据，被过滤
    double top_limit = 0.65;
    // 最低数据  z值低于此数据被过滤
    double botton_limit = -1.0;
    // 地面以上截取高度 z值在[ground_below, ground_above]之间数据被过滤
    double ground_above = 0.05;
    // 地面以下截取高度
    double ground_below = -0.1;
};


// 传感器ID
struct SensorBase{
    int id = 1000;                  //传感器索引
    string topic_name = "";         //默认订阅话题名称
    string sensor_frame = "";       //传感器坐标系
    bool enable = false;            //使能开关

    // 深度相机 深度图信息话题
    string camera_info_topic_name = "";
};

// 传感器位姿 相对于基坐标系，遵循右手坐标系
struct SensorTF{
    string base_frame = "base_link";    //基坐标系 默认base_link
    double x = 0.0;
    double y = 0.0;
    double z = 0.0;
    double roll = 0.0;
    double pitch = 0.0;
    double yaw = 0.0;
};

// 传感器参数
struct SensorParams{
    SensorBase sensor_base;
    SensorTF transform;
};

// 激光雷达传感器数据
struct LaserScanData{
    SensorBase sensor_base;
    sensor_msgs::LaserScan::Ptr scan_ptr;
};

// 深度点云 / 多线雷达数据
struct PointCloud2Data{
    SensorBase sensor_base;
    sensor_msgs::PointCloud2::Ptr pointcloud2_ptr = nullptr;
};

// 图像数据
struct ImageData{
    SensorBase sensor_base;
    sensor_msgs::Image::Ptr image_ptr = nullptr;
    sensor_msgs::CameraInfo::Ptr camera_info_ptr = nullptr;
};

// 超声波传感器数据
struct SonarData{
    SensorBase sensor_base;
    double distance = 0.0;
    bool trigger = false;
};

// 碰撞传感器数据
struct BumperData{
    SensorBase sensor_base;
    bool trigger = false;
};




#endif